package com.school.sports.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.school.sports.dto.EnrollmentDTO;
import com.school.sports.entity.Enrollment;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 报名数据访问层
 * 提供报名相关的数据库操作方法，包含优化的关联查询
 */
@Mapper
public interface EnrollmentMapper extends BaseMapper<Enrollment> {

    /**
     * 分页查询报名信息（包含用户和项目详细信息）
     * 使用JOIN查询避免N+1问题
     *
     * @param page 分页参数
     * @param userId 用户ID（可选）
     * @param projectId 项目ID（可选）
     * @param status 报名状态（可选）
     * @return 分页结果
     */
    IPage<EnrollmentDTO> selectEnrollmentPageWithDetails(
            Page<EnrollmentDTO> page,
            @Param("userId") Long userId,
            @Param("projectId") Long projectId,
            @Param("status") String status
    );

    /**
     * 根据用户ID查询报名信息（包含项目详细信息）
     *
     * @param userId 用户ID
     * @return 报名信息列表
     */
    List<EnrollmentDTO> selectEnrollmentsByUserIdWithDetails(@Param("userId") Long userId);

    /**
     * 根据项目ID查询报名信息（包含用户详细信息）
     *
     * @param projectId 项目ID
     * @return 报名信息列表
     */
    List<EnrollmentDTO> selectEnrollmentsByProjectIdWithDetails(@Param("projectId") Long projectId);

    /**
     * 根据ID查询报名详细信息（包含用户和项目信息）
     *
     * @param id 报名ID
     * @return 报名详细信息
     */
    EnrollmentDTO selectEnrollmentByIdWithDetails(@Param("id") Long id);
}